import axios from 'axios'
// 导入store
import store from '@/store'
import router from '@/router'
import { Toast } from 'vant'
// 设置基地址
const request = axios.create({
  baseURL: 'http://geek.itheima.net/'
})

// 请求拦截
request.interceptors.request.use(
  config => {
    // 携带token--判断是否有token
    if (store.state.user.tokenObj.token) {
      config.headers.Authorization = `Bearer ${store.state.user.tokenObj.token}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截
request.interceptors.response.use(
  response => {
    // 数据剥离
    return response.data
  },
  async error => {
    // 代表token过期
    if (error.response.status === 401) {
      try {
      // 刷新token -- 用axios-用axios-用axios
      // request身上有请求拦截器-就意味着每发一个请求都会被拦截下来
        const res = await axios({
          url: 'http://geek.itheima.net/v1_0/authorizations',
          method: 'put',
          headers: {
            Authorization: `Bearer ${store.state.user.tokenObj.refresh_token}`
          }
        })
        // 存到vuex里取更新 --- 要注意给的是一个对象，refresh_token没变过，token变了
        store.commit('user/setToken', {
          token: res.data.data.token,
          refresh_token: store.state.user.tokenObj.refresh_token
        })
        // 好比之前复习响应拦截是路径错了，所以改路径就是补救
        // 这里是token过期了，然后我上面利用refresh_token获取了新的token，算补救了
        // 算补救后，只要把之前的请求再发一次就能让我的页面里的请求也能得到正确的结果
        return request(error.config)
      } catch {
        // 打回登录页
        Toast('登录状态失效，请重新登录')
        router.push('/login')
        return Promise.reject(error)
      }
    } else {
      // 其他错误该抛出就抛出
      return Promise.reject(error)
    }
  }
)

// 暴露出去
export default request
